/*
 * The JTS Topology Suite is a collection of Java classes that implement the fundamental operations required to validate a given geo-spatial data set
 * to a known topological specification. Copyright (C) 2001 Vivid Solutions This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at
 * your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have
 * received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA For more information, contact: Vivid Solutions Suite #1A 2328 Government Street Victoria BC V8T 5G5
 * Canada (250)385-6040 www.vividsolutions.com
 */
package SpecialCollections;

import java.awt.geom.Rectangle2D;
import java.util.List;

/**
 * The basic insertion and query operations supported by classes implementing spatial index algorithms.
 * <p>
 * A spatial index typically provides a primary filter for range rectangle queries. A secondary filter is required to test for exact intersection. Of
 * course, this secondary filter may consist of other tests besides intersection, such as testing other kinds of spatial relationships.
 * 
 * @version 1.5
 */
public interface SpatialIndex<T>
{
	/**
	 * Adds a spatial item with an extent specified by the given {@link Rectangle2D} to the index
	 */
	void insert( Rectangle2D itemEnv, T item );

	/**
	 * Queries the index for all items whose extents intersect the given search {@link Rectangle2D} Note that some kinds of indexes may also return
	 * objects which do not in fact intersect the query envelope.
	 * 
	 * @param searchEnv the envelope to query for
	 * @return a list of the items found by the query
	 */
	List query( Rectangle2D searchEnv );

	/**
	 * Removes a single item from the tree.
	 * 
	 * @param itemEnv the Envelope of the item to remove
	 * @param item the item to remove
	 * @return <code>true</code> if the item was found
	 */
	boolean remove( Rectangle2D itemEnv, T item );

}
